<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // new一个对象的四个过程：

        // 1、 创建一个空对象

        // let obj = {};
        // 复制代码
        // 2、 让构造函数中的this指向新对象， 并执行构造函数的函数体

        // let result = Person.call(obj);
        // 复制代码
        // 3.将空对象的原型指向构造函数的原型
        // 3、 设置新对象的__proto__属性指向构造函数的原型对象

        // obj.__proto__ = Person.prototype;
        // 复制代码
        // 4、 判断构造函数的返回值类型， 如果是值类型， 则返回新对象。 如果是引用类型， 就返回这个引用类型的对象。

        // if (typeof (result) == "object")
        //     p = result;
        // else
        //     p = obj;


        // 1.创建空对象
        function foo() {}
        var a = new foo()
        // console.log(a);
        // 2.将空对象的原型指向构造函数的原型
        // console.log(a.__proto__ === foo.prototype)//true
        // 3.让构造函数中的this指向新对象， 并执行构造函数的函数体
        function a() {
            this.name = "111";
            console.log(this) //window,因为在全局调用的,window下面没有name这个值
        }
        console.log(new a())
        console.log(a());
        // 4.判断构造函数的返回值类型， 
        // 如果是值类型， 则返回新对象。 如果是引用类型， 就返回这个引用类型的对象。
    </script>


    <script>
        function a() {
            this.name = "111";
            console.log(this) //window,因为在全局调用的,window下面没有name这个值
        }
        console.log(new a())
        console.log(this.name); //这里永远都是空。window.name没有值
    </script>
</body>

</html>